package com.dimples.dd.system.mapper;

import com.dimples.dd.mybatis.core.mapper.BaseMapperX;
import com.dimples.dd.mybatis.core.query.MPJLambdaWrapperX;
import com.dimples.dd.system.model.bo.DeptBO;
import com.dimples.dd.system.model.entity.SystemDeptDO;
import com.dimples.dd.system.model.entity.SystemUsersDO;
import com.dimples.dd.system.model.query.DeptPageQuery;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface SystemDeptMapper extends BaseMapperX<SystemDeptDO> {

    /**
     * 查询部门列表
     *
     * @param queryParams 查询参数
     * @return 部门列表
     */
    default List<DeptBO> selectList(DeptPageQuery queryParams) {
        MPJLambdaWrapperX<SystemDeptDO> wrapperX = new MPJLambdaWrapperX<>();
        wrapperX.selectAll(SystemDeptDO.class)
                .selectAs(SystemUsersDO::getNickname, DeptBO::getLeader)
                .selectAs(SystemUsersDO::getId, DeptBO::getLeaderUserId);
        wrapperX.eqIfPresent(SystemDeptDO::getName, queryParams.getName()).
                eqIfPresent(SystemDeptDO::getStatus, queryParams.getStatus());
        wrapperX.leftJoin(SystemUsersDO.class, SystemUsersDO::getId, SystemDeptDO::getLeaderUserId);
        return this.selectJoinList(DeptBO.class, wrapperX);
    }

    /**
     * 根据父部门ID和部门名称查询部门
     *
     * @param parentId 父部门ID
     * @param name     部门名称
     * @return 部门
     */
    default SystemDeptDO selectByParentIdAndName(Long parentId, String name) {
        return selectOne(SystemDeptDO::getParentId, parentId, SystemDeptDO::getName, name);
    }

    /**
     * 根据父部门ID查询子部门数量
     *
     * @param parentId 父部门ID
     * @return 子部门数量
     */
    default long selectCountByParentId(Long parentId) {
        return selectCount(SystemDeptDO::getParentId, parentId);
    }
}